package collection;


import org.junit.Test;

import java.util.*;

/**
 * @description: TODO 类描述
 * @author: apple
 * @date:  2021/12/13 11:36 下午
 * @version 1.0
 **/
public class SetTest {
/*
  |----Set接口：存储无序的，不可重复的数据
                   |----HashSet、线程不安全，可以存储null  (内存也是也是无序的)，调用的是equals方法
                   		|----LinkedHashSet、遍历数据时，按照添加的顺序遍历   (内存也是无序的，只不过添加了一个链表，在遍历的时候维护了添加的顺序)
                   |----TreeSet、可以按照对象属性排序
 */

    @Test
    public void test1(){
        Set set = new HashSet();
        set.add("z");
        set.add("b");
        set.add("a");
        set.add(1);
        set.add(3.5);
        // 重新了equals和hashCode方法
        set.add(new Person2("a",20));
        set.add(new Person2("a",20));

        Iterator iterator = set.iterator();
        // 没有按照代码的顺序排列的
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

    }


    @Test
    public void test2(){
        // 其实还是无序的，只不过维护了一个链表。遍历顺序要高一点
        Set set = new LinkedHashSet();
        set.add("z");
        set.add("b");
        set.add("a");
        set.add(1);
        set.add(3.5);
        // 重新了equals和hashCode方法
        set.add(new Person2("a",20));
        set.add(new Person2("a",20));

        Iterator iterator = set.iterator();
        // 没有按照代码的顺序排列的
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

    }

}

class Person2 {

    private String name;
    private int age;

    public Person2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person2 person2 = (Person2) o;
        return age == person2.age && Objects.equals(name, person2.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
